/*
 * Selection.h
 *
 *  Created on: 2010-10-26
 *      Author: wenjian
 */

#ifndef SELECTION_H_
#define SELECTION_H_
#include "../commons.h"
#include "../draw/AbstractSelection.h"
#include "Elements.h"

namespace Ed {

  class Selection: public Ed::AbstractSelection, public Ed::Elements {
    public:
      Selection();
      virtual ~Selection();

      /**
       * 处理选择元素事件
       */
      virtual bool handle(const Thk::Event* e);


      /**
       * 加入元素
       */
      virtual bool add(AbstractElement* e, int pos=-1);


      /**
       * 移除元素
       */
      virtual bool remove(AbstractElement* e);


      /**
       * 清除所有元素
       */
      virtual void clear();

      /**
       * 加入除excluded以外的所有元素
       */
      virtual void addAllAndExclude(const std::vector<AbstractElement*>* els, const AbstractElement* excluded=NULL);

      /**
       * 移除参数<code>excluded</code>元素以外的元素, 在v中返回被移除的元素, excluded指示不被移除的元素,
       * v可以为NULL, 即不返回被移除的元素
       */
      virtual std::vector<AbstractElement*>* removesAndExclude(vector<AbstractElement*>* v=NULL, const AbstractElement* excluded=NULL);


      /**
       * 移除参数<code>excludeds</code>元素以外的元素, 在v中返回被移除的元素, excludeds指示不被移除的元素
       * v可以为NULL, 即不返回被移除的元素, excludeds中的元素必须是已经被排序过
       */
      virtual std::vector<AbstractElement*>* removesAndExcludes(vector<AbstractElement*>* v=NULL, const std::vector<AbstractElement*>* excludeds=NULL);

  };

}

#endif /* SELECTION_H_ */
